package org.jiuling.wecom.school.model;

import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import org.jiuling.local.tools.verify.BooleanVerify;
import org.jiuling.local.tools.verify.ObjectVerify;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 学生模型
 * @author 紫灵
 * @date 2023年04月03日 17时36分06秒
 */
public class StudentModel {

    /** 学生UserID */
    private String studentUserId;
    /** 学生名字 */
    private String name;
    /** 学生所在的班级id列表,不超过20个 */
    private List<Integer> departmentList;
    /** 学生家长列表 */
    private List<ParentModel> parentList;

    public String getStudentUserId() {
        return studentUserId;
    }

    public String getName() {
        return name;
    }

    public List<Integer> getDepartmentList() {
        return departmentList;
    }

    public List<ParentModel> getParentList() {
        return parentList;
    }

    /**
     * 家长
     */
    public static class ParentModel{
        /** 家长的userid */
        private String parentUserId;
        /** 学生与家长的关系 */
        private String relation;
        /** 家长手机号，第三方不可获取 */
        private String mobile;
        /** 家长是否关注了“学校通知”，0-未关注，1-已关注 */
        private boolean isSubscribe;
        /** 家长的external_userid,仅当家长已关注才返回。 */
        private String externalUserId;

        public String getParentUserId() {
            return parentUserId;
        }

        public String getRelation() {
            return relation;
        }

        public String getMobile() {
            return mobile;
        }

        public boolean isSubscribe() {
            return isSubscribe;
        }

        public String getExternalUserId() {
            return externalUserId;
        }

        /**
         * 建造者
         * @return 建造者
         */
        public static Builder builder(){
            return new Builder();
        }

        public static class Builder{

            /** 家长 */
            private final ParentModel parentModel;

            public Builder(){
                this.parentModel = new ParentModel();
            }

            /**
             * 添加家长的userid
             * @param parentUserId 家长的userid
             * @return 建造者
             */
            private Builder addParentUserId(String parentUserId){
                parentModel.parentUserId = parentUserId;
                return this;
            }

            /**
             * 添加学生与家长的关系
             * @param relation 学生与家长的关系
             * @return 建造者
             */
            public Builder addRelation(String relation){
                parentModel.relation = relation;
                return this;
            }

            /**
             * 添加家长手机号
             * @param mobile 家长手机号，第三方不可获取
             * @return 建造者
             */
            public Builder addMobile(String mobile){
                parentModel.mobile = mobile;
                return this;
            }

            /**
             * 添加家长是否关注了“学校通知”
             * @param isSubscribe 家长是否关注了“学校通知”，0-未关注，1-已关注
             * @return 建造者
             */
            public Builder addIsSubscribe(Boolean isSubscribe){
                parentModel.isSubscribe = BooleanVerify.isTrue(isSubscribe);
                return this;
            }

            /**
             * 添加家长的external_userid
             * @param externalUserId 家长的external_userid,仅当家长已关注才返回。
             * @return 建造者
             */
            public Builder addExternalUserId(String externalUserId){
                parentModel.externalUserId = externalUserId;
                return this;
            }

            /**
             * 通过JSON添加家长
             * @param parentJson 家长JSON
             * @return 建造者
             */
            public Builder addOParentByJson(JSONObject parentJson){
                parentModel.parentUserId = parentJson.getString("parent_userid");
                parentModel.relation = parentJson.getString("relation");
                parentModel.mobile = parentJson.getString("mobile");
                parentModel.isSubscribe = parentJson.getBoolean("is_subscribe");
                parentModel.externalUserId = parentJson.getString("external_userid");
                return this;
            }


            /**
             * 建造
             * @return 家长模型
             */
            public ParentModel build(){
                return parentModel;
            }

        }
    }

    /**
     * 建造者
     * @return 建造者
     */
    public static Builder builder(){
        return new Builder();
    }

    /**
     * 建造者
     */
    public static class Builder{
        /** 学生模块 */
        private final StudentModel studentModel;
        public Builder(){
            this.studentModel = new StudentModel();
        }

        /**
         * 添加学生UserID
         * @param studentUserId 学生UserID
         * @return 建造者
         */
        public Builder addStudentUserId(String studentUserId){
            studentModel.studentUserId = studentUserId;
            return this;
        }

        /**
         * 添加学生名字
         * @param name 学生名字
         * @return 建造者
         */
        public Builder addName(String name){
            studentModel.name = name;
            return this;
        }

        /**
         * 添加学生所在的班级id列表
         * @param departmentList 学生所在的班级id列表,不超过20个
         * @return 建造者
         */
        public Builder addDepartmentList(List<Integer> departmentList){
            studentModel.departmentList = departmentList;
            return this;
        }

        /**
         * 添加学生家长列表
         * @param parentList 学生家长列表
         * @return 建造者
         */
        public Builder addParentList(List<ParentModel> parentList){
            studentModel.parentList = parentList;
            return this;
        }

        /**
         * 通过JSON数据添加
         * @param studentJson 学生JSON数据
         * @return 建造者
         */
        public Builder addStudentByJson(JSONObject studentJson){
            studentModel.studentUserId = studentJson.getString("student_userid");
            studentModel.name = studentJson.getString("name");
            studentModel.departmentList = studentJson.getJSONArray("department").stream().map(department ->Integer.valueOf(String.valueOf(department))).collect(Collectors.toList());
            // 获取家长
            JSONArray parentJsonArray = studentJson.getJSONArray("parents");
            List<ParentModel> parentModelList = new ArrayList<>();
            if(!ObjectVerify.isNull(parentJsonArray) && !parentJsonArray.isEmpty()){
                for (int i = 0; i < parentJsonArray.size(); i++) {
                    parentModelList.add(ParentModel.builder().addOParentByJson(parentJsonArray.getJSONObject(i)).build());

                }
            }
            studentModel.parentList = parentModelList;
            return this;
        }

        /**
         * 建造
         */
        public StudentModel build(){
            return studentModel;
        }
    }


}
